////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxeepromdriver.h
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXEEPROMDRIVER_H
#define CAMXEEPROMDRIVER_H

#include "parametermodule.h"
#include "parameterfilesymboltable.h"
#include "parametertypes.h"
#include "camxsensorcommon.h"

#define CAMX_NAMESPACE_BEGIN namespace CamX {
#define CAMX_NAMESPACE_END }

CAMX_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// EEPROMSlaveInformation
///
/// Description:   EEPROM Slave Information
/// Comments:      EEPROM slave information
///                 element for EEPROMName
///                 element for slaveAddress
///                 elemet for regAddrType
///                 element for regDataType
///                 element for I2CFrequencyMode
///                 element for power up sequence
///                 element for power down sequence
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct EEPROMSlaveInformation
{
    /// Name of the EEPROM device
    CHAR*                                EEPROMName;
    /// 8-bit or 10-bit I2C slave Write address
    UINT16                               slaveAddress;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// regAddrType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType regAddrType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// regDataType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType regDataType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// i2cFrequencyMode
    /// Default Value: FAST
    /// Comments:      I2C frequency mode of slave
    ///                Supported modes are: STANDARD (100 KHz), FAST (400 KHz), FAST_PLUS (1 MHz), CUSTOM (Custom frequency in
    ///                DTSI)
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CFrequencyMode   i2cFrequencyMode;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// powerUpSequence
    /// Comments:      Sequence of power configuration type and configuration value required to control power to the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    PowerSequenceInfo  powerUpSequence;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// powerDownSequence
    /// Comments:      Sequence of power configuration type and configuration value required to control power to the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    PowerSequenceInfo  powerDownSequence;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// EndianType
/// Comments:      Type of the Endianness
///                Valid values are: BIG, LITTLE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
enum class EndianType
{
    BIG    = 0,
    LITTLE = 1
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// MemoryType
///
/// Description:   Memory Type
/// Comments:      Specifies the availability of the specified data and type of endianness
///                 element for operation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct MemoryType
{
    /// Specifies whether a particular OTP data available or not
    BOOL       isAvailable;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// endianness
    /// Default Value: BIG
    /// Comments:      Type of the Endianness
    ///                Valid values are: BIG, LITTLE
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EndianType endianness;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// MemoryInfo
/// Comments:      Specifies memory offset value and mask information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct MemoryInfo
{
    /// Offset value in the OTP memory
    UINT16 offset;
    /// mask value which will be applied to obtain required data bits
    UINT32 mask;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AfLensSagType
/// Comments:      Type of the Lens sag when AF infinity and macro calibration
///                Supported values are
///                 DEFAULT : Deg 90, Default, face forward
///                 DEG0_OTP : Face up, OTP/EEPROM calibrated
///                 DEG0_AVG : Face up, Average value
///                 DEG180_OTP : Face down, OTP/EEPROM calibrated
///                 DEG180_AVG : Face down, Average value
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
enum class AfLensSagType
{
    DEFAULT    = 0,
    DEG0_OTP   = 1,
    DEG0_AVG   = 2,
    DEG180_OTP = 3,
    DEG180_AVG = 4,
    MAX        = 5
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// AFInfo
/// Comments:      Specifies auto focus data information to format the OTP data
///                 element for AF data availablity and endian
///                 element for macro information
///                 element for infinity information
///                 element for hall information
///                 element for hall bias information
///                 element for vertical macro information
///                 element for vertical infinity information
///                 element for horizontal macro information
///                 element for horizontal infinity
///                 element for macro margin value information
///                 element for infinity margin value
///                 element for lens sag in macro calibration
///                 element for lens sag in infinity calibration
///                 element for calibrated value of gravity offset from 0 to 90 in eeprom or otp
///                 element for calibrated value of gravity offset from 90 to 180 in eeprom or otp
///                 element for average value of gravity offset from 0 to 90
///                 element for average value of gravity offset from 90 to 180
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct AFInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// autoFocusData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType    autoFocusData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// macro
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    macro;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// infinity
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    infinity;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// hall
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    hall;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// hallBias
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    hallBias;
    /// Hall register address to update with calibrated data
    UINT32        hallRegisterAddr;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// verticalMacro
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    verticalMacro;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// verticalInfinity
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    verticalInfinity;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// horizontalMacro
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    horizontalMacro;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// horizontalInfinity
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    horizontalInfinity;
    /// Margin value to extend towards macro region
    FLOAT         macroMargin;
    /// margin value to extend towards infinity region
    FLOAT         infinityMargin;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// lensSagCalMac
    /// Comments:      Type of the Lens sag when AF infinity and macro calibration
    ///                Supported values are
    ///                 DEFAULT : Deg 90, Default, face forward
    ///                 DEG0_OTP : Face up, OTP/EEPROM calibrated
    ///                 DEG0_AVG : Face up, Average value
    ///                 DEG180_OTP : Face down, OTP/EEPROM calibrated
    ///                 DEG180_AVG : Face down, Average value
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AfLensSagType lensSagCalMac;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// lensSagCalInf
    /// Comments:      Type of the Lens sag when AF infinity and macro calibration
    ///                Supported values are
    ///                 DEFAULT : Deg 90, Default, face forward
    ///                 DEG0_OTP : Face up, OTP/EEPROM calibrated
    ///                 DEG0_AVG : Face up, Average value
    ///                 DEG180_OTP : Face down, OTP/EEPROM calibrated
    ///                 DEG180_AVG : Face down, Average value
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AfLensSagType lensSagCalInf;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// otpGravityOfs0to90
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    otpGravityOfs0to90;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// otpGravityOfs90to180
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo    otpGravityOfs90to180;
    /// average value of gravity offset from 0 to 90
    INT16         avgGravityOfs0to90;
    /// average value of gravity offset from 90 to 180
    INT16         avgGravityOfs90to180;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// WBType
/// Comments:      Type of the white balance data
///                Valid values are: INDIVIDUAL, RATIO
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
enum class WBType
{
    INDIVIDUAL = 0,
    RATIO      = 1
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// EEPROMIlluminantType
/// Comments:      Type of the illuminant
///                Supported illuminants are D65, TL84, A, D50 and H
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
enum class EEPROMIlluminantType
{
    D65  = 0,
    TL84 = 1,
    A    = 2,
    D50  = 3,
    H    = 4,
    MAX  = 5
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// WBlightInfo
///
/// Description:   White balance light Information
/// Comments:      whitebalance information for a particular light type
///                 element for light type
///                 element for R value information
///                 element for gr Value information
///                 element for b Value information
///                 element for gb Value information
///                 element for rOverG Value information
///                 element for bOverG Value information
///                 element for grOverGB Value information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct WBlightInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// illuminantType
    /// Comments:      Type of the illuminant
    ///                Supported illuminants are D65, TL84, A, D50 and H
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EEPROMIlluminantType illuminantType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// rValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           rValue;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// grValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           grValue;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// bValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           bValue;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// gbValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           gbValue;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// rOverGValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           rOverGValue;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// bOverGValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           bOverGValue;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// grOverGBValue
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           grOverGBValue;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// WBInfo
/// Comments:      Specifies white balance data information to format the OTP data
///                 element for WB data availablity and endian
///                 element for WBType information
///                 element for WB light information
///                 element for mirror information
///                 element for flip information
///                 element for qValue information
///                 element for isInvertGROverGB information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct WBInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// WBData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType   WBData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// datatype
    /// Comments:      Type of the white balance data
    ///                Valid values are: INDIVIDUAL, RATIO
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    WBType       datatype;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// lightInfo - Array
    ///
    /// Description:   White balance light Information
    /// Min Length:    1
    /// Max Length:    Unbounded
    /// Comments:      whitebalance information for a particular light type
    ///                 element for light type
    ///                 element for R value information
    ///                 element for gr Value information
    ///                 element for b Value information
    ///                 element for gb Value information
    ///                 element for rOverG Value information
    ///                 element for bOverG Value information
    ///                 element for grOverGB Value information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32       lightInfoCount;
    UINT32       lightInfoID;
    WBlightInfo* lightInfo;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// mirror
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo   mirror;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// flip
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo   flip;
    /// Q value
    FLOAT        qValue;
    /// Set to TRUE if GRoverGB needs to be inverted
    BOOL         isInvertGROverGB;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// LSClightInfo
///
/// Description:   Lens shading light information
/// Comments:      Lens shading information for a particular rolloff light
///                 element for light type
///                 element for MSB part of the R gain value information
///                 element for LSB part of the R gain value information
///                 element for MSB part of the gr gain value information
///                 element for LSB part of the gr gain value information
///                 element for MSB part of the gb gain value information
///                 element for LSB part of the gb gain value information
///                 element for MSB part of the b gain value information
///                 element for LSB part of the b gain value information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct LSClightInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// illuminantType
    /// Comments:      Type of the illuminant
    ///                Supported illuminants are D65, TL84, A, D50 and H
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EEPROMIlluminantType illuminantType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// rGainMSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           rGainMSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// rGainLSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           rGainLSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// grGainMSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           grGainMSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// grGainLSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           grGainLSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// gbGainMSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           gbGainMSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// gbGainLSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           gbGainLSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// bGainMSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           bGainMSB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// bGainLSB
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo           bGainLSB;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// LSCInfo
/// Comments:      Specifies LSC data information to format the OTP data
///                 element for LSC data availablity and endian
///                 element for LSC light information
///                 element for mesh HW roll off size information
///                 element for incrimenting value for obtaing R value information
///                 element for incrimenting value for obtaing GR value information
///                 element for incrimenting value for obtaing GB value information
///                 element for incrimenting value for obtaing B value information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct LSCInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// LSCData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType    LSCData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// lightInfo - Array
    ///
    /// Description:   Lens shading light information
    /// Min Length:    1
    /// Max Length:    Unbounded
    /// Comments:      Lens shading information for a particular rolloff light
    ///                 element for light type
    ///                 element for MSB part of the R gain value information
    ///                 element for LSB part of the R gain value information
    ///                 element for MSB part of the gr gain value information
    ///                 element for LSB part of the gr gain value information
    ///                 element for MSB part of the gb gain value information
    ///                 element for LSB part of the gb gain value information
    ///                 element for MSB part of the b gain value information
    ///                 element for LSB part of the b gain value information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32        lightInfoCount;
    UINT32        lightInfoID;
    LSClightInfo* lightInfo;
    /// mesh HW rolloff size
    UINT16        meshHWRollOffSize;
    /// position of the next R value from the current R
    UINT16        rIncrement;
    /// position of the next GR value from the current GR
    UINT16        grIncrement;
    /// position of the next GB value from the current GB
    UINT16        gbIncrement;
    /// position of the next B value from the current B
    UINT16        bIncrement;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// DualCameraLensInfo
/// Comments:      Specifies lens information to format the dual camera data
///                 element for focal length information
///                 element for focal length ratio information
///                 element for native sensor resolution width information
///                 element for native sensor resolution height information
///                 element for calibration resolution width information
///                 element for incrimenting value for obtaing B value information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct DualCameraLensInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// focalLength
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo focalLength;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// focalLengthRatio
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo focalLengthRatio;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// nativeSensorResolutionWidth
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo nativeSensorResolutionWidth;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// nativeSensorResolutionHeight
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo nativeSensorResolutionHeight;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// calibrationResolutionWidth
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo calibrationResolutionWidth;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// calibrationResolutionHeight
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo calibrationResolutionHeight;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// DualCameraSystemInfo
/// Comments:      Specifies dural camera system information to format the dual camera data
///                 element for calibration format version information
///                 element for rotation matrix size information
///                 element for relative rotation matrix offset information
///                 element for geometric matrix size information
///                 element for relative geometric surface parameters offset information
///                 element for relative principle point X information
///                 element for relative principle point Y information
///                 element for relative position flag information
///                 element for relative baseline distance information
///                 element for master sensor mirror flip setting information
///                 element for auxilary sensor mirror flip setting information
///                 element for module orientation flag information
///                 element for rotation flag information
///                 element for brightness ratio information
///                 element for slave gain information
///                 element for slave exposure time information
///                 element for master gain information
///                 element for master exposure time information
///                 element for master color temperature information
///                 element for qValue
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct DualCameraSystemInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// calibrationFormatVersion
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  calibrationFormatVersion;
    /// size of the rotation matrix
    UINT32      rotationMatrixSize;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// relativeRotationMatrixOffset
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  relativeRotationMatrixOffset;
    /// size of the geometric matrix
    UINT32      geometricMatrixSize;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// relativeGeometricSurfaceParametersOffset
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  relativeGeometricSurfaceParametersOffset;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// relativePrinciplePointX
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  relativePrinciplePointX;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// relativePrinciplePointY
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  relativePrinciplePointY;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// relativePositionFlag
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  relativePositionFlag;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// relativeBaselineDistance
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  relativeBaselineDistance;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// masterSensorMirrorFlipSetting
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  masterSensorMirrorFlipSetting;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// auxSensorMirrorFlipSetting
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  auxSensorMirrorFlipSetting;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// moduleOrientationFlag
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  moduleOrientationFlag;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// rotationFlag
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo  rotationFlag;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// brightnessRatio - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32      brightnessRatioExists;
    UINT32      brightnessRatioID;
    MemoryInfo  brightnessRatio;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// referenceSlaveGain - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32      referenceSlaveGainExists;
    UINT32      referenceSlaveGainID;
    MemoryInfo  referenceSlaveGain;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// referenceSlaveExpTime - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32      referenceSlaveExpTimeExists;
    UINT32      referenceSlaveExpTimeID;
    MemoryInfo  referenceSlaveExpTime;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// referenceMasterGain - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32      referenceMasterGainExists;
    UINT32      referenceMasterGainID;
    MemoryInfo  referenceMasterGain;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// referenceMasterExpTime - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32      referenceMasterExpTimeExists;
    UINT32      referenceMasterExpTimeID;
    MemoryInfo  referenceMasterExpTime;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// referenceMasterColorTemp - Optional
    /// Min Length:    0
    /// Max Length:    1
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32      referenceMasterColorTempExists;
    UINT32      referenceMasterColorTempID;
    MemoryInfo  referenceMasterColorTemp;
    UINT32      qValueExists;
    UINT32      qValueID;
    FLOAT       qValue;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// DualCameraInfo
/// Comments:      Specifies dual camera data information to format the OTP data
///                 element for dual camera data availablity and endian
///                 element for offset address of the dual camera data
///                 element for size of the dual camera data information
///                 element for master sensor information
///                 element for aux sensor information
///                 element for dual camera system information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct DualCameraInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DualCameraData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType           DualCameraData;
    /// offset value to locate dual camera data
    UINT16               offset;
    /// size of the dual camera settings
    UINT32               settingsize;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// masterInfo
    /// Comments:      Specifies lens information to format the dual camera data
    ///                 element for focal length information
    ///                 element for focal length ratio information
    ///                 element for native sensor resolution width information
    ///                 element for native sensor resolution height information
    ///                 element for calibration resolution width information
    ///                 element for incrimenting value for obtaing B value information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    DualCameraLensInfo   masterInfo;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// auxInfo
    /// Comments:      Specifies lens information to format the dual camera data
    ///                 element for focal length information
    ///                 element for focal length ratio information
    ///                 element for native sensor resolution width information
    ///                 element for native sensor resolution height information
    ///                 element for calibration resolution width information
    ///                 element for incrimenting value for obtaing B value information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    DualCameraLensInfo   auxInfo;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// systemInfo
    /// Comments:      Specifies dural camera system information to format the dual camera data
    ///                 element for calibration format version information
    ///                 element for rotation matrix size information
    ///                 element for relative rotation matrix offset information
    ///                 element for geometric matrix size information
    ///                 element for relative geometric surface parameters offset information
    ///                 element for relative principle point X information
    ///                 element for relative principle point Y information
    ///                 element for relative position flag information
    ///                 element for relative baseline distance information
    ///                 element for master sensor mirror flip setting information
    ///                 element for auxilary sensor mirror flip setting information
    ///                 element for module orientation flag information
    ///                 element for rotation flag information
    ///                 element for brightness ratio information
    ///                 element for slave gain information
    ///                 element for slave exposure time information
    ///                 element for master gain information
    ///                 element for master exposure time information
    ///                 element for master color temperature information
    ///                 element for qValue
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    DualCameraSystemInfo systemInfo;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// SPCInfo
/// Comments:      Specifies shield pixel correction data information to format the OTP data
///                 element for SPC data availablity and endian
///                 element for offset address of the SPC data
///                 element for SPC address information
///                 element for size of the SPC settings information
///                 element for address type information
///                 element for data type information
///                 element for delay to write each registry entry information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct SPCInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SPCData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType                           SPCData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dataOffset
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo                           dataOffset;
    /// register address value to write SPC data
    UINT16                               SPCAddress;
    /// size of the SPC data settings
    UINT32                               settingsSize;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// addressType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType addressType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dataType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType dataType;
    /// Delay in milli seconds. Delay is 0 if not explicitly provided
    UINT16                               delay;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// OISInfo
/// Comments:      Specifies ois calibration data information to format the OTP data
///                 element for OIS data availablity and endian
///                 element for offset address of the SPC data
///                 element for OIS address information
///                 element for size of the OIS settings information
///                 element for address type information
///                 element for data type information
///                 element for delay to write each registry entry information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct OISInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// OISData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType                           OISData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dataOffset
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo                           dataOffset;
    UINT32                               OISAddressArrayCount;
    UINT32                               OISAddressArrayID;
    UINT32*                              OISAddressArray;
    /// size of the OIS data settings
    UINT32                               settingsSize;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// addressType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType addressType;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dataType
    ///
    /// Range:         [1,4]
    /// Comments:      Register address / data size in bytes
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    I2CRegAddrDataType dataType;
    /// Delay in milli seconds. Delay is 0 if not explicitly provided
    UINT16                               delay;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PDAFDCCInfo
/// Comments:      Specifies PDAF defocus conversion coefficient data information to format the OTP data
///                 element for DCC data availablity and endian
///                 element for offset address of the slope data
///                 element for offset data offset information
///                 element for knot X information
///                 element for knot Y information
///                 element for offset X information
///                 element for offset Y information
///                 element for area X information
///                 element for area Y information
///                 element for Q value information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct PDAFDCCInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DCCData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType DCCData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// slopeDataOffset
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo slopeDataOffset;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// offsetDataOffset
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo offsetDataOffset;
    /// knot X value
    UINT16     knotX;
    /// knot Y value
    UINT16     knotY;
    /// offset X value
    UINT16     offsetX;
    /// offset Y value
    UINT16     offsetY;
    /// area X value
    UINT16     areaX;
    /// area Y value
    UINT16     areaY;
    /// Q value
    UINT16     qValue;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PDAF2DInfo
/// Comments:      Specifies PDAF defocus conversion coefficient data information to format the OTP data
///                 element for PDAF 2D data availablity and endian
///                 element for version information
///                 element for map width information
///                 element for map height information
///                 element for gain width information
///                 element for gain height information
///                 element for left gain map information
///                 element for right gain map information
///                 element for conversion Coefficient Count information
///                 element for conversion Coefficient information
///                 element for DCC Q Format
///                 element for DCC map width information
///                 element for DCC map height information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct PDAF2DInfo
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PDAF2DData
    ///
    /// Description:   Memory Type
    /// Comments:      Specifies the availability of the specified data and type of endianness
    ///                 element for operation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryType PDAF2DData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// version
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo version;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// mapWidth
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo mapWidth;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// mapHeight
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo mapHeight;
    /// gain width
    UINT16     gainWidth;
    /// gain height
    UINT16     gainHeight;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// leftGainMap
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo leftGainMap;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// rightGainMap
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo rightGainMap;
    /// count of the conversion coefficient
    UINT16     conversionCoefficientCount;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// conversionCoefficient
    /// Comments:      Specifies memory offset value and mask information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryInfo conversionCoefficient;
    UINT16     DCCQFormat;
    UINT16     DCCMapWidth;
    UINT16     DCCMapHeight;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// EEPROMDataFormatInformation
///
/// Description:   EEPROM Data Format Information
/// Comments:      EEPROM data format information
///                 element for auto focus information
///                 element for white balance information
///                 element for lens shading information
///                 element for dual camera information
///                 element for shield pixel information
///                 element for OIS calibration information
///                 element for PDAF DCC information
///                 element for pdaf 2D information
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct EEPROMDataFormatInformation
{

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// AF
    /// Comments:      Specifies auto focus data information to format the OTP data
    ///                 element for AF data availablity and endian
    ///                 element for macro information
    ///                 element for infinity information
    ///                 element for hall information
    ///                 element for hall bias information
    ///                 element for vertical macro information
    ///                 element for vertical infinity information
    ///                 element for horizontal macro information
    ///                 element for horizontal infinity
    ///                 element for macro margin value information
    ///                 element for infinity margin value
    ///                 element for lens sag in macro calibration
    ///                 element for lens sag in infinity calibration
    ///                 element for calibrated value of gravity offset from 0 to 90 in eeprom or otp
    ///                 element for calibrated value of gravity offset from 90 to 180 in eeprom or otp
    ///                 element for average value of gravity offset from 0 to 90
    ///                 element for average value of gravity offset from 90 to 180
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    AFInfo         AF;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// WB
    /// Comments:      Specifies white balance data information to format the OTP data
    ///                 element for WB data availablity and endian
    ///                 element for WBType information
    ///                 element for WB light information
    ///                 element for mirror information
    ///                 element for flip information
    ///                 element for qValue information
    ///                 element for isInvertGROverGB information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    WBInfo         WB;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// LSC
    /// Comments:      Specifies LSC data information to format the OTP data
    ///                 element for LSC data availablity and endian
    ///                 element for LSC light information
    ///                 element for mesh HW roll off size information
    ///                 element for incrimenting value for obtaing R value information
    ///                 element for incrimenting value for obtaing GR value information
    ///                 element for incrimenting value for obtaing GB value information
    ///                 element for incrimenting value for obtaing B value information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    LSCInfo        LSC;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// dualCamera
    /// Comments:      Specifies dual camera data information to format the OTP data
    ///                 element for dual camera data availablity and endian
    ///                 element for offset address of the dual camera data
    ///                 element for size of the dual camera data information
    ///                 element for master sensor information
    ///                 element for aux sensor information
    ///                 element for dual camera system information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    DualCameraInfo dualCamera;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SPC
    /// Comments:      Specifies shield pixel correction data information to format the OTP data
    ///                 element for SPC data availablity and endian
    ///                 element for offset address of the SPC data
    ///                 element for SPC address information
    ///                 element for size of the SPC settings information
    ///                 element for address type information
    ///                 element for data type information
    ///                 element for delay to write each registry entry information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SPCInfo        SPC;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// OIS
    /// Comments:      Specifies ois calibration data information to format the OTP data
    ///                 element for OIS data availablity and endian
    ///                 element for offset address of the SPC data
    ///                 element for OIS address information
    ///                 element for size of the OIS settings information
    ///                 element for address type information
    ///                 element for data type information
    ///                 element for delay to write each registry entry information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    OISInfo        OIS;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PDAFDCC
    /// Comments:      Specifies PDAF defocus conversion coefficient data information to format the OTP data
    ///                 element for DCC data availablity and endian
    ///                 element for offset address of the slope data
    ///                 element for offset data offset information
    ///                 element for knot X information
    ///                 element for knot Y information
    ///                 element for offset X information
    ///                 element for offset Y information
    ///                 element for area X information
    ///                 element for area Y information
    ///                 element for Q value information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    PDAFDCCInfo    PDAFDCC;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PDAF2D
    /// Comments:      Specifies PDAF defocus conversion coefficient data information to format the OTP data
    ///                 element for PDAF 2D data availablity and endian
    ///                 element for version information
    ///                 element for map width information
    ///                 element for map height information
    ///                 element for gain width information
    ///                 element for gain height information
    ///                 element for left gain map information
    ///                 element for right gain map information
    ///                 element for conversion Coefficient Count information
    ///                 element for conversion Coefficient information
    ///                 element for DCC Q Format
    ///                 element for DCC map width information
    ///                 element for DCC map height information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    PDAF2DInfo     PDAF2D;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CustomInformation
/// Comments:      Custom Information for formating the OTP data or for any other purpose
///                 custom element name
///                 custom element value
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct CustomInformation
{
    /// Name of the custom element to identify what kind of information it is
    /// There are some fixed name for custom info:
    /// AFOffset, WBOffset, SensorVersionOffset, ModuleVersionOffset...
    CHAR* name;
    /// value of the custom element corresponding to the custom name
    INT32 value;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// EEPROMDriverData
/// Comments:      EEPROM driver data
///                 element for slaveInfo
///                 element for memoryMap
///                 element for slaveInfo
///                 element for customInfo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
struct EEPROMDriverData
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Binary file symbol table entry ID
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32 SymbolTableID;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// module_version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    struct module_versionStruct
    {
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /// Binary file symbol table entry ID
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        UINT32 SymbolTableID;
        INT32 major_revision;
        INT32 minor_revision;
        INT32 incr_revision;
    } module_version;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// slaveInfo
    ///
    /// Description:   EEPROM Slave Information
    /// Comments:      EEPROM slave information
    ///                 element for EEPROMName
    ///                 element for slaveAddress
    ///                 elemet for regAddrType
    ///                 element for regDataType
    ///                 element for I2CFrequencyMode
    ///                 element for power up sequence
    ///                 element for power down sequence
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EEPROMSlaveInformation         slaveInfo;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// memoryMap
    /// Comments:      Sequence of register settings to configure the device
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SettingsInfo memoryMap;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// formatInfo
    ///
    /// Description:   EEPROM Data Format Information
    /// Comments:      EEPROM data format information
    ///                 element for auto focus information
    ///                 element for white balance information
    ///                 element for lens shading information
    ///                 element for dual camera information
    ///                 element for shield pixel information
    ///                 element for OIS calibration information
    ///                 element for PDAF DCC information
    ///                 element for pdaf 2D information
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EEPROMDataFormatInformation    formatInfo;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// customInfo - Array
    /// Min Length:    0
    /// Max Length:    50
    /// Comments:      Custom Information for formating the OTP data or for any other purpose
    ///                 custom element name
    ///                 custom element value
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    UINT32                         customInfoCount;
    UINT32                         customInfoID;
    CustomInformation*             customInfo;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// EEPROMDriverDataClass
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class EEPROMDriverDataClass : public ParameterModule, public EEPROMDriverData
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Version
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const UINT16 MAJOR = 1;
    static const UINT16 MINOR = 0;
    static const UINT32 PATCH = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Default Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EEPROMDriverDataClass(
        const CHAR* name);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EEPROMDriverDataClass(
        const CHAR* name,
        UINT32 modeId,
        UINT16 mode,
        UINT16 subMode,
        UINT32 group);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destructor
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~EEPROMDriverDataClass();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetName
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static const CHAR* GetName(
        const CHAR* type);


    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load EEPROMSlaveInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadEEPROMSlaveInformation(
        ParameterFileSymbolTableEntry* entry,
        EEPROMSlaveInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load MemoryType
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadMemoryType(
        ParameterFileSymbolTableEntry* entry,
        MemoryType* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load MemoryInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadMemoryInfo(
        ParameterFileSymbolTableEntry* entry,
        MemoryInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load AFInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadAFInfo(
        ParameterFileSymbolTableEntry* entry,
        AFInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load WBlightInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadWBlightInfo(
        ParameterFileSymbolTableEntry* entry,
        WBlightInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load WBInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadWBInfo(
        ParameterFileSymbolTableEntry* entry,
        WBInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load LSClightInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadLSClightInfo(
        ParameterFileSymbolTableEntry* entry,
        LSClightInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load LSCInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadLSCInfo(
        ParameterFileSymbolTableEntry* entry,
        LSCInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load DualCameraLensInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadDualCameraLensInfo(
        ParameterFileSymbolTableEntry* entry,
        DualCameraLensInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load DualCameraSystemInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadDualCameraSystemInfo(
        ParameterFileSymbolTableEntry* entry,
        DualCameraSystemInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load DualCameraInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadDualCameraInfo(
        ParameterFileSymbolTableEntry* entry,
        DualCameraInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load SPCInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadSPCInfo(
        ParameterFileSymbolTableEntry* entry,
        SPCInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load OISInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadOISInfo(
        ParameterFileSymbolTableEntry* entry,
        OISInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load PDAFDCCInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadPDAFDCCInfo(
        ParameterFileSymbolTableEntry* entry,
        PDAFDCCInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load PDAF2DInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadPDAF2DInfo(
        ParameterFileSymbolTableEntry* entry,
        PDAF2DInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load EEPROMDataFormatInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadEEPROMDataFormatInformation(
        ParameterFileSymbolTableEntry* entry,
        EEPROMDataFormatInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load CustomInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadCustomInformation(
        ParameterFileSymbolTableEntry* entry,
        CustomInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load EEPROMDriverData
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL LoadEEPROMDriverData(
        ParameterFileSymbolTableEntry* entry,
        EEPROMDriverData* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Load module_versionStruct
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static BOOL Loadmodule_versionStruct(
        ParameterFileSymbolTableEntry* entry,
        EEPROMDriverData::module_versionStruct* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload EEPROMSlaveInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadEEPROMSlaveInformation(
        EEPROMSlaveInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload WBInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadWBInfo(
        WBInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload LSCInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadLSCInfo(
        LSCInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload OISInfo
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadOISInfo(
        OISInfo* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload EEPROMDataFormatInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadEEPROMDataFormatInformation(
        EEPROMDataFormatInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload CustomInformation
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadCustomInformation(
        CustomInformation* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Unload EEPROMDriverData
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static void UnloadEEPROMDriverData(
        EEPROMDriverData* structure);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Parse symbol table entry, and return a new object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ParameterModule* Parse(
        ParameterSetManager* manager,
        ParameterFileSymbolTableEntry* entry) const;

}; // End class EEPROMDriverDataClass

CAMX_NAMESPACE_END
#endif // CAMXEEPROMDRIVER_H

